/*
 * Copyright (C) 2023 HiHope Open Source Organization .
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

 #include <stdio.h>
 #include <unistd.h>
 
 #include "ohos_init.h"
 #include "cmsis_os2.h"
 #include "iot_gpio.h"
 #include "iot_pwm.h"
 #include "iot_errno.h"
 #include "hi_io.h"
 
 //osThreadNew()
 // 定义三色灯LED连接的 GPIO 引脚编号
 #define RED_LED_PIN_NAME 2
 #define G_LED_PIN_NAME 8
 #define B_LED_PIN_NAME 7

 // 定义红色LED使用的GPIO功能
 #define RED_LED_PIN_FUNCTION WIFI_IOT_IO_FUNC_GPIO_10_GPIO
 #define GREEN_LED_PIN_FUNCTION WIFI_IOT_IO_FUNC_GPIO_10_GPIO
 #define BLUE_LED_PIN_FUNCTION WIFI_IOT_IO_FUNC_GPIO_10_GPIO


 // 定义PWM占空比的最大值
 #define IOT_PWM_DUTY_MAX  100
 // 定义PWM频率分频系数
 #define PWM_FREQ_DIVITION 64000
 // 定义延时时间（微秒）
 #define DELAY_US 250000
 // 定义任务堆栈大小
 #define STACK_SIZE (4096)
 // 定义PWM端口号
 #define PWM_PORT_NUM  (2)



 // 定义倍增因子
 #define DOUBLE  (2)
 
 // PWM LED演示任务函数
 static void PWMLedDemoTask(void)
 {
     static int g_count = 100; // 定义循环计数器，初始值为100

 
     while (g_count) { // 循环100次
         // 将红色LED引脚设置为PWM输出模式
         hi_io_set_func(RED_LED_PIN_NAME, HI_IO_FUNC_GPIO_10_PWM1_OUT);
         // 初始化PWM模块
         IoTPwmInit(2);
         // 使用PWM控制红色LED亮度
         for (int i = 1; i < IOT_PWM_DUTY_MAX; i *= DOUBLE) {
             // 启动PWM，设置占空比为i，频率分频系数为PWM_FREQ_DIVITION
             IoTPwmStart(2, i, PWM_FREQ_DIVITION);
             // 延时DELAY_US微秒
             usleep(DELAY_US);
             // 停止PWM
             IoTPwmStop(2);
         }

        // 将绿色LED引脚设置为PWM输出模式
         hi_io_set_func(G_LED_PIN_NAME, HI_IO_FUNC_GPIO_10_PWM1_OUT);
         // 初始化PWM模块
         IoTPwmInit(1);
         for (int i = 1; i < IOT_PWM_DUTY_MAX; i *= DOUBLE) {
             // 启动PWM，设置占空比为i，频率分频系数为PWM_FREQ_DIVITION
             IoTPwmStart(1, i, PWM_FREQ_DIVITION);
             // 延时DELAY_US微秒
             usleep(DELAY_US);
             // 停止PWM
             IoTPwmStop(1);
         }

        // 将蓝色LED引脚设置为PWM输出模式
        hi_io_set_func(B_LED_PIN_NAME, HI_IO_FUNC_GPIO_10_PWM1_OUT);
        // 初始化PWM模块
        IoTPwmInit(0);
        for (int i = 1; i < IOT_PWM_DUTY_MAX; i *= DOUBLE) {
            // 启动PWM，设置占空比为i，频率分频系数为PWM_FREQ_DIVITION
            IoTPwmStart(0, i, PWM_FREQ_DIVITION);
            // 延时DELAY_US微秒
            usleep(DELAY_US);
            // 停止PWM
            IoTPwmStop(0);
        }
         g_count--; // 每次循环后减少计数器
     }
 }
 
 // PWM LED演示入口函数
 static void PWMLedDemo(void)
 {
     osThreadAttr_t attr; // 定义任务属性结构体
 
     // 初始化红色LED引脚
     IoTGpioInit(RED_LED_PIN_NAME);
 
     // 设置任务名称为"PWMLedDemoTask"
     attr.name = "PWMLedDemoTask";
     // 设置任务属性位掩码，默认为0
     attr.attr_bits = 0U;
     // 回调内存，默认为空
     attr.cb_mem = NULL;
     // 回调内存大小，默认为0
     attr.cb_size = 0U;
     // 堆栈内存，默认为空
     attr.stack_mem = NULL;
     // 设置堆栈大小为STACK_SIZE
     attr.stack_size = STACK_SIZE;
     // 设置任务优先级为正常优先级
     attr.priority = osPriorityNormal;
 
     // 创建任务PWMLedDemoTask，检查创建是否成功
     if (osThreadNew(PWMLedDemoTask, NULL, &attr) == NULL) {
         printf("[ColorfulLightDemo] Failed to create PWMLedDemoTask!\n"); // 如果创建失败，输出错误信息
     }
 }
 
 // 注册初始化函数PWMLedDemo，当系统启动时会自动调用这个函数来执行任务创建和PWM控制的相关操作
 APP_FEATURE_INIT(PWMLedDemo);